package com.example.d5_proxy2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyUtil {
    /**
     * 创建UserService的代理实例
     * 该代理实例用于在特定方法调用前后添加额外的逻辑，例如性能监控
     *
     * @param userService UserService接口的实现实例
     * @return 返回代理后的UserService实例
     */
    public static UserService createProxy(UserService userService) {
        return (UserService) Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(), // 使用当前类加载器
                new Class[]{UserService.class}, // 代理需要实现的接口
                (proxy, method, args) -> {
                    // 在方法调用前后添加逻辑
                    if (method.getName().equals("login") || method.getName().equals("deleteUsers") ||
                        method.getName().equals("selectUsers")) {
                        long startTime = System.currentTimeMillis(); // 记录方法开始执行的时间

                        Object rs = method.invoke(userService, args); // 调用实际的方法

                        long endTime = System.currentTimeMillis(); // 记录方法执行结束的时间
                        // 打印方法执行耗时
                        System.out.println(method.getName() + "方法执行耗时：" + (endTime - startTime) / 1000.0 + "s");
                        return rs;
                    } else {
                        // 如果是其他方法，直接调用不添加额外逻辑
                        return method.invoke(userService, args);
                    }
                });
    }
}
